#!/usr/bin/env python
# coding: utf-8

# import
from requests_html import HTMLSession
import time
import re
session = HTMLSession()



# 原测试用url
# url = 'https://catalog.xmu.edu.cn/opac/item.php?marc_no=0004101344'



def bib_it(url):
	# 这也太粗糙了，但是居然能get到

	r = session.get(url)
	print(r.html)
	# bib = 网页给定GB格式参考文献
	bib = r.html.xpath('//*[@id="sidebar_item"]/div[3]/p')[0].text
	# 放弃双保险

	# 题名+责任者
	item_details = r.html.find('#item_detail > dl')
	个人责任者列表 = []
	个人次要责任者列表 = []
	for item in item_details:
		item_detail = item.find('dt')[0].text
		if item_detail == '题名/责任者:':
			authors = item.find('dd')[0].text
		elif item_detail == '出版发行项:':
			publish = item.find('dd')[0].text
		elif item_detail == '个人责任者:':
			# 这里面还包含逗号和年份
			# author = item.find('dd')[0].text
			个人责任者列表.append(item.find('dd')[0].text)
		elif item_detail == '个人次要责任者:':
			# 这里面还包含逗号和年份！
			个人次要责任者列表.append(item.find('dd')[0].text)

	classofitem = bib.split('[')[1][0]
	
	不是专著也不是论文 = []
	if classofitem == 'M':
		enw_class = 'Book'
	

		# 拆分出标题和作者+译者
		given_title_and_authors = authors.split('/')
		given_title = given_title_and_authors[0]

		# bib中的标题不是完整标题，从这里提取标题（包括副标题）
		given_authors = given_title_and_authors[1]
		

		# 还在纠结是否用全名（根据GB要求不需要全名，只需要姓氏）
		# 但是我决定在输出的txt文件中包括全名，以方便筛选和删除
		# 多了可以删，但少了再回去复核就比较麻烦

		# 被逼无奈现场学习正则表达式

		zh_characters_list = re.findall(r"[\u4e00-\u9fa5]",given_authors, re.IGNORECASE)
		zh_string = ''.join(zh_characters_list)

		given_author = given_authors.split(' ')
		# given_author += given_authors.split(';')
		# given_author = list(tuple(given_author))

		bib_author_and_title = bib.split('.')
		bib_author = bib_author_and_title[0].strip()
		bib_title = bib_author_and_title[1].split('[')[0]
		if bib_author.endswith(','):
			bib_author = bib_author[:-1] # 考虑到万一中间有逗号，还是去掉最后的一个字符吧
		given_author_list = []
		
		for a in given_author:
			if a.startswith('('):
				# print(a) 这是国籍，不管它
				continue
			else:
				given_author_list.append(a)
		# 发现有的bib母胎带有多余的逗号，需要去掉


		# final_author = bib_author # 先指定是bib中给定的
		if len(zh_string) < 1:
			print(bib)
			a_list = []
			for a in 个人责任者列表:
				author_splited = tuple(a.split(','))
				a_list.append(author_splited)
			
			final_authors_list = []

			for author_splited in a_list:
				final_author_name_list = []
				for a in author_splited:
					if a.strip().encode('UTF-8').isalpha():
						final_author_name_list.append(a)
					elif '-' in a:
						hyphenInName = False
						b = a.split('-')
						for c in b:
							if c.strip().encode('UTF-8').isdigit():
								continue
							elif c.strip().encode('UTF-8').isalpha():
								hyphenInName = True
						if hyphenInName:
							final_author_name_list.append(a)
					elif a.strip().encode('UTF-8').isdigit():
						continue
					final_author = ', '.join(final_author_name_list)
				final_authors_list.append(final_author)
		else:
			final_authors_list = []

			for b in 个人责任者列表:
				for a in given_author_list:
					name = a[:-1].strip()
					if name.endswith(b.split(' ')[0]):
						final_author = name
						final_authors_list.append(final_author)
					else:
						continue
			if len(final_authors_list) < 1:
				final_authors_list = bib_author.split(',')

				
			# 暂时不考虑多个著者（平行）的情况，今晚该睡了。

		translators = []
		try:
			
			for translator in 个人次要责任者列表:
				if translator.split(' ')[-1].strip() == '译':
					translator = translator[:-2].split(',')[0]
					translators.append(translator)
				# 防不胜防，还有译者附加信息（生卒年）
				# 懒得细分了，直接用逗号点断
				# 如果是外国人呢？


				# print(final_translator)
		except:
			print(bib + '找不到译者')
			pass

		final_title = bib_title.strip()
		if given_title.startswith(bib_title):
			final_title = given_title.strip()

		publish = publish.split(':')
		# 出版地
		locality = publish[0]
		# 出版社+出版年
		press_and_year = publish[1].split(',')
		# 出版社
		press = press_and_year[0]
		# 出版年
		year = press_and_year[1]

		
		if len(translators) >= 1:
			final_author = ', '.join(final_authors_list)
			final_translator = ', '.join(translators)
			final_gb7714 = final_author + '. ' + final_title + '[' + classofitem + ']. ' + final_translator + ', 译. ' + locality + ': ' + press + ', ' + year + '.'

		else:
			final_author = ', '.join(final_authors_list)	
			final_gb7714 = final_author + '. ' + final_title + '[' + classofitem + ']. ' + locality + ': ' + press + ', ' + year + '.'

		# 写入enw
		with open('reference.enw','a',encoding='utf8') as enw:
			enw.write('%0 Book\n')
			for final_author in final_authors_list:
				enw.write('%A '+final_author+'\n')
			enw.write('%D '+year+'\n')
			enw.write('%T '+final_title+'\n')
			enw.write('%I '+press+'\n')
			if len(translators) >= 1:# 上面定义了空列表
				for translator in translators:
					enw.write('%? ' + translator + '\n')
			else:
				pass
			enw.write('%! '+final_title+'\n\n')

		return final_gb7714

	elif classofitem == 'D':
		enw_class = 'Thesis'
		final_gb7714 = bib
		return final_gb7714 
		# 我自己肯定不借学位论文（也借不了）
		# 反而肯定使用知网直接输出
		# 所以不考虑
	else:
		print(bib + '识别符为：\n' + classofitem)
		不是专著也不是论文.append(bib)

	

if __name__ == '__main__':

	# original txt file
	来源 = 'books.txt'

	# read txt
	url_list = []
	with open(来源,'r',encoding='utf8') as f:
		lines = f.readlines()
		for line in lines:
			if line.startswith('https://'):
				url_list.append(line.strip())

	GB7714 = []

	for url in url_list:
		print(url)
		final_gb7714 = bib_it(url)
		GB7714.append(final_gb7714)
		time.sleep(5)

	with open('GB7714.txt','w',encoding='utf8') as f:
		for item in GB7714:
			f.write(item + '\n')